package com.fastloan.mgt.processcontrol.base.service;


import com.fastloan.mgt.application.base.model.ProcessFlow;
import com.fastloan.mgt.processcontrol.base.model.Process;
import com.fastloan.mgt.processcontrol.base.model.ProcessBaseSession;
import com.fastloan.mgt.processcontrol.base.model.CustomProcess;
import com.fastloan.mgt.processcontrol.base.model.ProcessSchedule;

import java.util.List;
import java.util.function.Function;

/**
 * @author yanwe
 * createTime 2017-11-2017/11/6 15:57
 */
public interface SubjectProcessService {

    /**
     * 根据流程查询方法列表
     *
     * @param processId 主体
     * @return 方法列表
     */
    List<CustomProcess> selectProcessFlow(String processId);

    /**
     * 保存流程对象
     *
     * @param processSchedule 流程与主体
     * @return 流程ID
     */
    String createProcess(Process processSchedule, Function<String,List<ProcessFlow>> function);

    /**
     * 获得流程对象
     *
     * @param processId 流程ID
     * @return 流程与主体
     */
    Process getProcess(String processId);

    /**
     * 根据配置的需要清理的状态返回主体id列表
     *
     * @param status 状态列表
     * @return 主体id列表
     */
    List<String> getNeedCleanSubjects(List<Integer> status);

    /**
     * 持久化流程Session
     *
     * @param processSession 流程Session
     */
    void saveProcessSession(ProcessBaseSession processSession);

    /**
     * 获得流程Session
     *
     * @return 流程Session
     */
    ProcessBaseSession getProcessSession(String processId);

    /**
     * 保存流程进度
     *
     * @param processId 流程id
     * @param processScheduleList 流程进度
     */
    void saveProcessSchedule(String processId ,List<ProcessSchedule> processScheduleList);

    /**
     * 获得流程进度
     *
     * @param processId 流程id
     * @return 流程进度
     */
    List<ProcessSchedule> getProcessScheduleList(String processId);

    /**
     * 流程结束对应操作
     */
    void processEndHandle(String processId);
}
